请解释描述中真正发生的事情

时间:2021-06-06 07:16:12

标签: python python-3.x

我正在阅读 Python 速成课程以开始学习 Python,然后就开始学习了

>>> favorite_language = 'python '
>>> favorite_language
'python '
>>> favorite_language.rstrip()
'python'
>>> favorite_language
'python '

作者随后提到rstrip()方法的使用是暂时的,要使其永久化,我们必须执行以下操作

>>> favorite_language = 'python '
>>> favorite_language = favorite_language.rstrip()
>>> favorite_language
'python

我在这里的第二步很困惑

 >>> favorite_language = favorite_language.rstrip()

如果我们从基础上看到,当python解释这个并到达第二步时,它认为它必须为favorite_language存储一个新值,并格式化变量并开始存储新值,但在=对同一变量调用方法之后存储同一变量的值。

这不会导致错误吗?

2 个答案:

答案 0 :(得分:2)

favorite_language = favorite_language.rstrip() 用新值重新分配 favorite_language,新值是从 favorite_language.rstrip() 返回的值。

favorite_language.rstrip() 本身不会通过调用方法改变原始字符串(Python 中的 str() 在任何情况下都是不可变的)。要修改 favorite_language,我们必须明确地说:

“嘿,favorite_language,这是给你的新价值”

是:favorite_language = new_value

但在这种情况下,新值是 favorite_language.rstrip() 返回的值。

= 右侧的所有表达式都在任何赋值发生之前进行评估。此外,由于 Python 中的 str() 是不可变的,因此调用 favorite_language.rstrip() 不会修改任何内容,它产生新值,然后可以将其存储在 favorite_language 中。因此,新值的产生发生在任何重新分配之前。

有关评估顺序的更多信息(以及更多),请查看 documentation

答案 1 :(得分:0)

基本上在每种命令式语言(以及许多其他语言!)中,赋值看起来都类似于

lvalue ← expression

其中语义是“评估表达式,并将结果分配给左值”。

在很多情况下,如果你不能在表达式中使用lvalue本身,并让它引用上一个,那确实会很麻烦。 em> 左值的值。有许多算法需要从索引变量中添加或减去一个,或者向累加器添加新项。相反,在没有情况下,不能这样做是一个有用的功能。但是一些原始语言确实要求您在这些场景中使用临时变量。

Python(以及 C 和许多其他语言)中的赋值运算符看起来与表示相等的数学符号相同的事实让一些初学者感到困惑;这就是为什么有些语言使用左箭头,或者像 :=(在 Pascal 中;现在在 Python 中的语义略有不同)或 :-(在例如 Prolog 中)这样的风格化 ASCII 近似值的原因。