4

为什么我不能使用海象运算符:=来分配属性?它在分配给局部变量时起作用:

my_eyes = ["left", "right"]
if saved_eye := my_eyes.index("left"):
    print(saved_eye)

# outputs >>> 0

但是,如果我尝试分配给对象属性,则会出现语法错误:

class MyEyes:
    def __init__(self):
        self.eyes = ["left", "right"]
        self.saved_eye = None

    def ohyes(self):
        if self.saved_eye := self.eyes.index("left"):
            print(self.saved_eye)

x = MyEyes()
x.ohyes()

# raises 
# >>> if self.saved_eye := self.eyes.index("left"):
# >>> SyntaxError: cannot use assignment expressions with attribute 

我的意思是我可以使用临时局部变量绕过错误,但为什么会发生这种情况?我相信 100% 这是一种合法的语法。

4

1 回答 1

4

如 中所述,语法是非法的PEP 572,其中定义了海象运算符(又名“赋值表达式”):

最重要的是,由于 := 是一个表达式,它可以在语句非法的上下文中使用,包括 lambda 函数和推导式。

相反,赋值表达式不支持赋值语句中的高级特性:

不支持单个 NAME 以外的单个分配目标:

# No equivalent
a[i] = x
self.rest = []

这有点罗嗦,但这意味着海象运算符不支持属性赋值。

您得到的错误也非常特定于这种情况,验证这一点(“不能使用带有属性的赋值表达式”意味着“不能使用海象运算符设置属性”)。

于 2021-04-26T02:52:25.493 回答