【问题标题】:how to stop python from "binding" variables that stand for lists [duplicate]如何阻止python“绑定”代表列表的变量[重复]
【发布时间】:2017-12-27 11:53:08
【问题描述】:

在python中,代码

x = 0
y = x
y = 1
print x

代码返回“0”

x = [0]
y = x
y[0] = 1
print x

返回“[1]”。 为什么 python 对待列表与整数的处理方式如此不同,我能做些什么来强制它像对待顶部“x”一样对待底部的“x”?看起来像'='在各自的第二行意味着不同的东西——最上面一行只影响 y,而底部则以某种方式将 x 绑定到 y。那么也许我需要在底部代码中使用不同的符号?

【问题讨论】:

  • 不,他们正在做同样的事情。阅读:nedbatchelder.com/text/names.html
  • 这里不涉及任何字符串(print 所做的转换除外),你所拥有的是一个列表y = x 在像列表这样的 mutable 对象上只是一个引用赋值,它们引用的对象是相同的。
  • 这是因为xy指的是同一个对象。
  • 但是“相应的第三行”中的=s 表现完全不同
  • @cdarke 对,谢谢我已经编辑过了。

标签: python


【解决方案1】:
a = [20, 21]
b = [20, 21]

print(a is b) # False
print(a == b) # True
print(id(a) != id(b)) # True

ab 具有相同的值,但不引用相同的对象。

x = [1]
y = x

print(x is y) # True
print(x == y) # True
print(id(x) == id(y)) # True

xy 具有相同的值并引用相同的对象。

i = [0]
j = i[:] # Copy of i

print(i is j) # False
print(i == j) # True
print(id(i) != id(j)) # True

ij 具有相同的值,但不引用相同的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2016-08-02
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多