为什么多个分配和单个分配在python中表现不同

发布于 2021-01-29 15:05:48

我在python中使用队列时,即使代码对我来说看起来很完美,但我仍然在代码中出现错误,但是后来当我突然更改赋值样式时,代码开始工作。该代码看起来像以前一样。

    x=y=Queue()
    x.put("a")
    x.put("b")
    print y.get()

后来我改变了这个,它开始工作

    x=Queue()
    y=Queue()
    x.put("a")
    x.put("b")
    print y.get(10)

为什么两个代码的工作方式不同?

关注者
0
被浏览
60
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    Python中的变量是引用或名称,不像C中的变量等。

    这段代码:

    x=y=Queue()
    

    表示“允许名称y引用通过调用在内存中创建的对象Queue(),并允许该名称x引用y指向的对象。” 这意味着两个变量都指向同一个对象-
    您可以使用进行验证id(x) == id(y)

    这段代码:

    x=Queue()
    y=Queue()
    

    表示“允许名称x引用由制成的一个对象Queue(),并允许名称y引用由制成的另一个对象Queue()”。在这种情况下,id(x) == id(y)False

    这通常会咬你:

    a = [1,2,3,4,5]
    b = a
    b.append(6)
    print(a)
    # [1,2,3,4,5,6] even though we didn't seem to do anything to a!
    

    要解决此问题,请import copy; b = a.copy();改为执行b = a

    但是,这种行为不会发生在像整数这样的不可变对象上:

    a = 7
    a += 1
    

    不会 转到a引用的对象并通过添加一个对象来更改它,而是a从对象7取消引用,并将其引用到表示a+
    1(即8)的先前值的对象。这与对可变对象执行的操作不同,就像上一个示例中的列表 一样 -追加到列表 确实会 更改变量所引用的对象。

    因此,我们可以这样做:

    a = 7
    b = a
    a += 1
    print(a)
    # 8
    print(b)
    # 7
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看