【问题标题】:Assignment of variables in Python [duplicate]Python中的变量赋值[重复]
【发布时间】:2016-11-22 17:31:13
【问题描述】:

在 Python 中,我创建了整数和列表对象,如下所示:

a = 10
b = 10
x = []
y = []

然后我在比较ab的id,以及xy的id时得到以下结果

id(a)==id(b)  returns True
id(x)==id(y) returns False

在某处我读到 Python 中的那个作业从不复制数据。我的问题是为什么 x 和 y 没有相同的 id?

【问题讨论】:

  • 因为 Python 使用整数缓存而不是列表缓存

标签: python


【解决方案1】:

您必须知道 python 整数是缓存的并且是不可变的,这意味着 ab 都标记了相同的 10。列表是对象,它们是单独分配的,这就是为什么它们的 id 与开头不同的原因

【讨论】:

  • Lists 是对象是什么意思?Python 中的整数对象不是?
  • @Zerihun Python 中的一切都是对象,但整数、浮点数和字符串都是不可变的。它们有方法,但这些方法不会修改对象,这(虽然完全合法)有点令人困惑。
【解决方案2】:

列表是可变的,如果使用相同的对象,当您将一个项目添加到列表之一时,您也会看到另一个列表的更改。

整数的标识依赖于实现,通常只对小数有效;好好读书here

顺便说一句,== 是相等运算符。 id(a)==id(b) 的最短(和更简洁)方法是使用身份运算符 is。在您的情况下:a is b

【讨论】:

    【解决方案3】:

    x = [] 是实例化新列表的简写,表示新对象具有新对象 ID。即使xy 被分配为空列表,它们只是对分配给各个列表的内存位置的引用。如果id(x) == id(y)xy 将共享相同的对象ID,这实际上意味着它们共享一个内存位置,或者是对同一对象的引用(因此对一个对象所做的任何更改都将应用于另一个对象)。

    另一方面,id(a) == id(b) 因为它们都是整数,都是原始数据类型。

    【讨论】:

    • 'x=[]'在python中是一个列表,'a'和'b'的标识并不是因为整数是原始数据类型
    • 我的错,更正了数组引用。
    猜你喜欢
    • 2013-09-13
    • 2017-12-18
    • 2014-05-06
    • 2016-02-03
    • 2015-03-21
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多