python变量类型声明_Python变量声明

好的,首先要做的事情。

Python中没有“变量声明”或“变量初始化”这样的东西。

简直就是我们所谓的“任务”,但应该只是称之为“命名”。

分配意味着“左侧的这个名称现在指的是评估右侧的结果,无论它之前提到的是什么(如果有的话)”。foo = 'bar' # the name 'foo' is now a name for the string 'bar'foo = 2 * 3 # the name 'foo' stops being a name for the string 'bar',# and starts being a name for the integer 6, resulting from the multiplication

因此,Python的名称(比“变量”更好的术语,可以说)没有关联的类型; 价值观。您可以将相同的名称重新应用于任何类型,无论其类型如何,但事物仍然具有依赖于其类型的行为。该名称只是一种引用值(对象)的方法。这回答了您的第二个问题:您不创建变量来保存自定义类型。您不创建变量来保存任何特定类型。你根本不“创造”变量。你给对象命名。

第二点:当涉及到类时,Python遵循一个非常简单的规则,实际上比Java,C ++和C#等语言更加一致:块内声明的所有内容都是class类的一部分。因此,def这里编写的functions()是方法,即类对象的一部分(不是基于每个实例存储),就像在Java,C ++和C#中一样; 但这里的其他名字也是班级的一部分。同样,名称只是名称,它们没有关联类型,函数也是 Python 中的对象。从而:class Example:

data = 42

def method(self): pass

在Python中,类也是对象。

所以现在我们创建了一个名为的对象Example,它代表了所有东西的类Example。该对象有两个用户提供的属性(在C ++中,“成员”;在C#中,“字段或属性或方法”;在Java中,“字段或方法”)。其中一个是命名的data,它存储整数值42。另一个是命名的method,它存储一个函数对象。(Python自动添加了几个属性。)

但是,这些属性仍然不是对象的一部分。从根本上说,一个对象只是一堆更多的名称(属性名称),直到你找到不能再分割的东西。因此,如果您故意设置了值,则可以在类的不同实例之间共享值,甚至可以在不同类的对象之间共享。

让我们创建一个实例:x = Example()

现在我们有一个名为的单独对象x,它是一个实例Example。的data和method实际上不是对象的一部分,但我们仍然可以找一找通过x的,因为有些魔力,Python做幕后。当我们查找时method,特别是,我们将获得一个“绑定方法”(当我们调用它时,x会自动作为self参数传递,如果我们Example.method直接查找则不会发生)。

当我们尝试使用时会发生什么x.data?

当我们检查它时,它首先在对象中查找。如果在对象中找不到它,Python会在类中查找。

但是,当我们分配时 x.data,Python将在对象上创建一个属性。它不会取代类的属性。

这允许我们进行对象初始化。Python将__init__在创建新实例时自动调用类' 方法(如果存在)。在这个方法中,我们可以简单地分配属性来为每个对象设置该属性的初始值:class Example:

name = "Ignored"

def __init__(self, name):

self.name = name # rest as before

现在我们必须指定一个name创建时间Example,每个实例都有自己的实例name。Example.name每当我们查找.name实例时,Python都会忽略class属性,因为首先会找到实例的属性。

最后一点需要注意:修改(变异)和赋值是不同的事情!

在Python中,字符串是不可变的。它们无法修改。当你这样做时:a = 'hi 'b = a

a += 'mom'

您不会更改原始的“hi”字符串。这在Python中是不可能的。相反,您创建一个新字符串'hi mom',并导致a不再是一个名称'hi ',并开始成为一个名称'hi mom'。我们也给b了一个名字'hi ',在重新申请a名字后,b仍然是一个名字'hi ',因为它'hi '仍然存在并且没有被改变。

但列表可以更改:a = [1, 2, 3]b = a

a += [4]

现在b也是[1,2,3,4],因为我们b为a命名相同的东西命名,然后我们改变了那个东西。我们没有为aname命名创建一个新列表,因为Python只是对+=列表采用不同的方式。

这对于对象很重要,因为如果您有一个列表作为类属性,并使用实例来修改列表,那么更改将在所有其他实例中“看到”。这是因为(a)数据实际上是类对象的一部分,而不是任何实例对象; (b)因为您正在修改列表而没有进行简单的赋值,所以您没有创建隐藏class属性的新实例属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值