【问题标题】:assigned in python considered as a copy of an object在python中赋值被视为对象的副本
【发布时间】:2018-10-12 13:51:51
【问题描述】:

我不明白为什么在第一个例子中,b 被认为是a 的副本,它会随着a 而改变,但在第二个例子中没有

def bubbleSort(alist):
    for passnum in range(len(alist)-1,0,-1):
        for i in range(passnum):
            if alist[i]>alist[i+1]:
                temp = alist[i]
                alist[i] = alist[i+1]
                alist[i+1] = temp
    return  alist

a=[3,2,1]
b=a
a=bubbleSort(a)
print(a)
print(b)

输出:

[1, 2, 3]
[1, 2, 3]

a=[3,2,1]
b=a
a=[1,2,3]

print(a)
print(b)

输出:

[1, 2, 3]
[3, 2, 1]

【问题讨论】:

  • 这篇文章可能对您有所帮助:Facts and myths about Python names and values,由 SO 资深人士 Ned Batchelder 撰写。
  • 顺便说一句,请不要将代码片段用于 Python 代码,它们仅适用于可以在 Web 浏览器中运行的代码:HTML、CSS、JavaScript。
  • 提示:在您的第一个示例中,b 不是“a 的副本”——ab 是指向同一个对象的两个名称。

标签: python object bubble-sort


【解决方案1】:
a=[3,2,1]
b=a # **here you're refrencing by memory not value**
a=bubbleSort(a)

print id(a) 
print id(b)

# these both will give you same memory reference

print(a)
print(b)

在第二个示例中,当您执行 b=a 时,您通过内存引用,但是当您执行 a=[1,2,3] 时,您将 a 关联到新的内存引用 b 仍然绑定到旧的一。

a = [3,2,1]
b=a

print id(b) #4376879184
print id(a) #4376879184


#they will be having the same id

a = [1,2,3]
#now you have assigned a new address which will have the new array

print id(b) #4376879184
print id(a) #4377341464
#they will be having different id now

【讨论】:

    【解决方案2】:

    在您的第一个示例中 - 您将“引用”发送到在 a 和 b 之间共享的列表(并更改它)。

    在第二个示例中 - 您在声明 a = [1,2,3] 时显式更改了“引用”

    如果你想解决这个问题,请从冒泡排序函数返回一个不同的实例(不要更改正在发送的实际列表,创建一个新列表并返回它 - 这是你在 C 中使用指针所做的事情,在 python 中更少)。

    无论哪种方式,都可以阅读一些关于 python 中可变/不可变类型的信息 - https://medium.com/@meghamohan/mutable-and-immutable-side-of-python-c2145cf72747(google 上的第一个结果)。

    【讨论】:

      猜你喜欢
      • 2020-12-23
      • 2015-07-11
      • 1970-01-01
      • 2013-11-29
      • 2012-02-16
      • 2015-09-26
      • 2011-06-15
      相关资源
      最近更新 更多