Python 将多个变量分配给相同的值?列表行为

新手上路,请多包涵

我尝试使用如下所示的多重赋值来初始化变量,但我对这种行为感到困惑,我希望单独重新分配值列表,我的意思是 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 许可协议

阅读 313
2 个回答

如果您是从 C/Java/等语言转向 Python。家庭,它可能会帮助您停止将 a 视为“变量”,而开始将其视为“名称”。

abc 不是具有相同值的不同变量;它们是相同值的不同名称。变量有类型、身份、地址和诸如此类的各种东西。

名字没有这些。当然, 可以,而且同一个值可以有很多名称。

如果你给 Notorious B.I.G. 一个热狗,\* Biggie SmallsChris Wallace 有一个热狗。如果将 a 的第一个元素更改为1,则 bc 的第一个元素为1。

如果您想知道两个名称是否在命名同一个对象,请使用 is 运算符:

 >>> a=b=c=[0,3,5]
>>> a is b
True


然后你问:

这有什么不同?

 d=e=f=3
e=4
print('f:',f)
print('e:',e)

在这里,您将名称 e 重新绑定到值 4 。这不会以任何方式影响名称 df

在您以前的版本中,您分配给 a[0] ,而不是 a 。所以,从 a[0] 的角度来看,你正在重新绑定 a[0] ,但从 a eed1b80ea336224b8b49a9b293-6a4a1 的角度来看,你正在改变它,地方。

您可以使用 id 函数,它会为您提供一些代表对象身份的唯一编号,即使在 is 无法帮助时,也可以准确地查看哪个对象是哪个:

 >>> a=b=c=[0,3,5]
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261120
>>> id(b[0])
4297261120

>>> a[0] = 1
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261216
>>> id(b[0])
4297261216

请注意 a[0] 已从 4297261120 更改为 4297261216 - 现在它是不同值的名称。并且 b[0] 现在也是相同新值的名称。那是因为 ab 仍然在命名同一个对象。


在幕后, a[0]=1 实际上是在调用列表对象上的方法。 (它相当于 a.__setitem__(0, 1) 。)所以,它根本 没有 重新绑定任何东西。这就像调用 my_object.set_something(1) 。当然,对象可能正在重新绑定实例属性以实现此方法,但这并不重要;重要的是你没有分配任何东西,你只是在改变对象。和 a[0]=1 一样。


user570826 问:

如果我们有, a = b = c = 10

这与 a = b = c = [1, 2, 3] 的情况完全相同:您有相同值的三个名称。

但在这种情况下,该值为 int ,而 int 是不可变的。在任何一种情况下,您都可以将 a 重新绑定到不同的值(例如 a = "Now I'm a string!" ),但不会影响原始值,即 b -cb08d29 c 仍将是名称。不同之处在于,对于列表,您可以将值 [1, 2, 3] 更改为 [1, 2, 3, 4] ,例如 a.append(4) ; since that’s actually changing the value that b and c are names for, b will now b [1, 2, 3, 4] .无法将值 10 更改为其他任何值。 10 永远是 10,就像吸血鬼克劳迪娅永远是 5(至少在她被克尔斯滕邓斯特取代之前)。


\* 警告:不要给 Notorious BIG 热狗。 Gangsta 说唱僵尸不应该在午夜后喂食。

原文由 abarnert 发布,翻译遵循 CC BY-SA 3.0 许可协议

咳嗽

>>> a,b,c = (1,2,3)
>>> a
1
>>> b
2
>>> c
3
>>> a,b,c = ({'test':'a'},{'test':'b'},{'test':'c'})
>>> a
{'test': 'a'}
>>> b
{'test': 'b'}
>>> c
{'test': 'c'}
>>>

原文由 Jimmy Kane 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏