我尝试使用如下所示的多重赋值来初始化变量,但我对这种行为感到困惑,我希望单独重新分配值列表,我的意思是 b[0] 和 c[0] 像以前一样等于 0。
a=b=c=[0,3,5]
a[0]=1
print(a)
print(b)
print(c)
结果是:[1, 3, 5] [1, 3, 5] [1, 3, 5]
那是对的吗?我应该使用什么进行多项分配?这有什么不同?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
结果:(’f:’,3)(’e:’,4)
原文由 Marco 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您是从 C/Java/等语言转向 Python。家庭,它可能会帮助您停止将
a
视为“变量”,而开始将其视为“名称”。a
,b
和c
不是具有相同值的不同变量;它们是相同值的不同名称。变量有类型、身份、地址和诸如此类的各种东西。名字没有这些。当然, 值 可以,而且同一个值可以有很多名称。
如果你给
Notorious B.I.G.
一个热狗,\*Biggie Smalls
和Chris Wallace
有一个热狗。如果将a
的第一个元素更改为1,则b
和c
的第一个元素为1。如果您想知道两个名称是否在命名同一个对象,请使用
is
运算符:然后你问:
在这里,您将名称
e
重新绑定到值4
。这不会以任何方式影响名称d
和f
。在您以前的版本中,您分配给
a[0]
,而不是a
。所以,从a[0]
的角度来看,你正在重新绑定a[0]
,但从a
eed1b80ea336224b8b49a9b293-6a4a1 的角度来看,你正在改变它,地方。您可以使用
id
函数,它会为您提供一些代表对象身份的唯一编号,即使在is
无法帮助时,也可以准确地查看哪个对象是哪个:请注意
a[0]
已从 4297261120 更改为 4297261216 - 现在它是不同值的名称。并且b[0]
现在也是相同新值的名称。那是因为a
和b
仍然在命名同一个对象。在幕后,
a[0]=1
实际上是在调用列表对象上的方法。 (它相当于a.__setitem__(0, 1)
。)所以,它根本 没有 重新绑定任何东西。这就像调用my_object.set_something(1)
。当然,对象可能正在重新绑定实例属性以实现此方法,但这并不重要;重要的是你没有分配任何东西,你只是在改变对象。和a[0]=1
一样。user570826 问:
这与
a = b = c = [1, 2, 3]
的情况完全相同:您有相同值的三个名称。但在这种情况下,该值为
int
,而int
是不可变的。在任何一种情况下,您都可以将a
重新绑定到不同的值(例如a = "Now I'm a string!"
),但不会影响原始值,即b
-cb08d29c
仍将是名称。不同之处在于,对于列表,您可以将值[1, 2, 3]
更改为[1, 2, 3, 4]
,例如a.append(4)
; since that’s actually changing the value thatb
andc
are names for,b
will now b[1, 2, 3, 4]
.无法将值10
更改为其他任何值。10
永远是 10,就像吸血鬼克劳迪娅永远是 5(至少在她被克尔斯滕邓斯特取代之前)。\* 警告:不要给 Notorious BIG 热狗。 Gangsta 说唱僵尸不应该在午夜后喂食。