【问题标题】:how does python assignment(=) operator workpython赋值(=)运算符如何工作
【发布时间】:2017-04-08 18:21:47
【问题描述】:

我写了一个链表,当我使用多重赋值时,结果很奇怪。python和javascript有什么不同?

示例 python 代码

class ListNode(object):
def __init__(self, x):
    self.val = x
    self.next = None

node=ListNode(0)
node=node.next=ListNode(10)
#expect node.next=ListNode(10) node=node.next
print(node ==node.next) # True why? 

同样的逻辑JavaScript代码

function ListNode(val){
    this.val=val;
    this.next=null;
}
var node=new ListNode(0);
node=node.next=new ListNode(10)
console.log(node==node.next) //false

【问题讨论】:

标签: python


【解决方案1】:

在 Python 中,求值的顺序是相反的。因此:

node = node.next = ListNode(10)

和这个是一样的:

node = ListNode(10)
node.next = node

所以,你必须在最后一次赋值之前反转元素的顺序:

node.next = node = ListNode(10)
# same as:
node.next = ListNode(10)
node = node.next

【讨论】:

  • 赋值node.next = node = ListNode(10) 等价于tmp = ListNode(10); node.next = tmp; node = tmp,隐藏了tmp 变量。书面答案表明 node 不会因分配而改变,这是不正确的。
  • @Craig 谢谢。固定的。 :)
  • @Craig 我在哪里可以知道作业的详细信息,我在 Python 教程中找不到
  • @shenli - 在documentation赋值语句计算表达式列表...并将单个结果对象分配给每个目标列表,从左到右(强调我的)。除了简单的初始化之外,我会避免将此构造用于任何其他操作。您会看到它会引起多少混乱。电话:stackoverflow.com/questions/14056146/…
【解决方案2】:

实际上,您将node 重新分配为等于node.next,因此node == node.next 将始终为True,因为这两个变量指向同一个对象。

【讨论】:

    【解决方案3】:

    我不确定你想用这条线完成什么:

    node = node.next = ListNode(10)
    

    如果你这样做:

    node.next = ListNode(10)
    

    你会得到你想要的结果

    in [1]: node=ListNode(0)
    
    In [2]: node.val
    Out[2]: 0
    
    In [3]: node.next = ListNode(10)
    
    In [4]: node.val
    Out[4]: 0
    
    In [5]: node.next.val
    Out[5]: 10
    
    In [6]: node == node.next
    Out[6]: False    
    

    【讨论】:

      【解决方案4】:

      赋值操作从右到左求值:

      node.next = ListNode(10)
      node = node.next
      

      【讨论】:

      • 这不是发生了什么!
      猜你喜欢
      • 2016-08-20
      • 2016-04-03
      • 2012-03-18
      • 2012-07-15
      • 2020-08-10
      • 2011-09-18
      • 2015-09-27
      • 2011-08-02
      相关资源
      最近更新 更多