当前位置: 首页 > 面试题库 >

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

乐正涵忍
2023-03-14
问题内容

我在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)

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


问题答案:

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


 类似资料:
  • 问题内容: 我注意到当我运行高度依赖CPU的python程序时,它仅使用一个内核。运行该程序时是否可以为其分配多个内核? 问题答案: 您必须为多个内核进行显式编程。有关Python中的许多并行处理解决方案,请参见此页面上的“对称多处理”选项。如果您不愿意比较这些选项,那么并行Python是一个不错的选择,请查看此处的示例。 但是,有些问题不能利用多核。考虑一下如何在三个朋友的帮助下更快地上楼梯。不

  • 问题内容: 在python 3.4中,我输入 并且工作正常,不会引发异常。虽然当然不等于事后。 也可以。 引发异常,但是, 引发异常,但是。发生什么了? 问题答案: 您不是为了平等而比较。您正在 分配 。 Python允许您分配给多个目标: 将两个值分别分配给和。您只需要在右侧有一个 序列 或 可迭代 ,在左侧有一个名称列表或元组。 当您这样做时: 您为 空 名称列表分配了一个 空 序列(空字符串

  • 问题内容: 以下Python表达式之间有什么区别: 第一给出的结果与第二给出的结果不同。 例如, 第一: 第二: y是第一的 3 和第二的 4 问题答案: 在赋值语句中,总是在对变量进行实际设置之前先对右侧进行全面评估。所以, 评估板y(我们称之为的结果),评估(呼叫),然后设置要和y到。也就是说,就像 相比之下, 设置x为y,然后设置,因此等效于

  • 问题内容: 我很想知道是否有一种“ pythonic”的方法来将列表中的值分配给元素?更清楚地说,我要的是这样的东西: 以便: 我正在寻找比手动执行任何其他更好的选择: 问题答案: 只需输入: 当您像上面那样被分配给多个变量时,Python就会使用。 在此扩展中,您还可以解压缩为多个小于使用star运算符的长度的变量:

  • 问题内容: 这是在最近的PyCon演讲中提出的。 该声明 没有任何意义,但是也不会引发异常。我觉得这一定是由于拆箱规则造成的。您也可以使用列表对元组进行解包,例如, 符合您的期望。作为逻辑结果,当要拆包的元素数为0时,这也应该起作用,这将解释为什么分配给空列表是有效的。当您尝试将非空列表分配给空列表时会发生什么,进一步支持了该理论: 如果元组也是如此,我将对此解释感到满意。如果我们可以解压缩到包含

  • 因此,我昨天开始了一个问题:基于同一行中的值的多个pandas赋值,我想知道如何对一行数据进行排序,并将排序分配给同一行中的不同列。我已经按照Ed Chum的建议解决了这个问题:如何一次将一个函数应用于pandas数据帧中的多个列。 它确实起作用了,但我注意到我在这一过程中创建了错误的列。一旦我修复了这个bug,它就不再工作了。。。。 因此,我尝试在一个玩具示例上重现这个问题,但在玩具示例上也不起