【问题标题】:Python: Literals: Evaluation of LiteralsPython:文字:文字的评估
【发布时间】:2021-12-08 14:11:52
【问题描述】:

来自 Python 文档:

6.2.2. Literals
...
对具有相同值(程序文本中的相同出现或不同出现)的文字进行多次评估可能会获得具有相同值的相同对象或不同对象

我需要理解上面这段话,但觉得很不安。我需要你的帮助来澄清某些事情:

>>> " Got any rivers you think are uncrossable ?" #1
' Got any rivers you think are uncrossable ?' #2
>>> " Got any rivers you think are uncrossable ?" #3
' Got any rivers you think are uncrossable ?' #4

#1 和#3 是两个具有相同值的文字,它们分别获得相同的对象#2 和#4。这些对象的值是相同的。 他们的评价怎么会得到具有相同价值的不同对象呢? 这里的评估结果和发生的事情有什么关系?

在程序文本中出现相同或不同 发生

如何区分同一事件和不同事件? 发生地点与评估结果有什么关系?

【问题讨论】:

标签: python literals evaluation


【解决方案1】:

两者都是字符串对象,即使值相同也有不同的 id。例如:

>>> id("My string")
140140708077104
>>> id("My string")
140140708085936
>>> my_first_string = "Repeated value"
>>> my_second_string = "Repeated value"
>>> my_first_string == my_second_string
True
>>> id(my_first_string) == id(my_second_string)
False

【讨论】:

  • 这是一个交互式会话。在脚本中尝试一下,看看是否得到相同的结果。
  • 这称为字符串池或字符串实习。请参阅this question/answer 进行一些很好的讨论
  • 完全正确!!感谢您提供解释链接!
【解决方案2】:

比较这两个:

>>> a = 'a'
>>> b = 'a'
>>> id(a)
1799740566768
>>> id(b)
1799740566768

>>> a = 'a b'
>>> b = 'a b'
>>> id(a)
1799740710960
>>> id(b)
1799751802672

在内部,在第一个示例中,ab 都引用 same 对象,而在第二个示例中,它们引用 不同 对象。

这可能会产生一些意想不到的结果:在第一种情况下,a is b -> True,但在第二种情况下,a is b -> False

为什么重要?

正如评论中所说,您可能不需要关心。对于 immutable 字面量,在访问“相同”字面量时,您的代码是指相同的对象还是不同的对象在功能上应该没有区别。但是,对于可变对象,了解可能的副作用绝对很重要。

有关详细信息,请参阅例如 Under which circumstances do equal strings share the same reference?What does sys.intern() do and when should it be used?

编辑:测试结果,如果你得到相同或不同的对象,使用下面的脚本:

if __name__=="__main__":
    for i in range(100):
        a = ''.join(['a']*i)
        b = ''.join(['a']*i)
        print(f'a: {a}\nb: {b}\na is b: {a is b}')

给我以下结果,在 Windows PowerShell 中运行 Python 3.9.7:

a:
b:
a is b: True
a: a
b: a
a is b: True
a: aa
b: aa
a is b: False
a: aaa
b: aaa
a is b: False
a: aaaa
b: aaaa
a is b: False
a: aaaaa
b: aaaaa
a is b: False
a: aaaaaa
b: aaaaaa
a is b: False
... etc.

【讨论】:

  • 虽然字符串是交互式会话中的单独对象,但当两个相同的字符串文字出现在同一个脚本中时,这不是典型的行为。
  • @khelwood 来源?
  • “如果相同的字符串文字在源代码中出现两次,它们最终将指向同一个字符串对象”在the answer 到您链接的第一个问题。另外,试试吧。
  • 为了跟进索赔,在为自己尝试时,我无法使用问题编辑中的测试脚本复制“指向相同字符串对象的相同字符串文字”。
  • 你的测试不是在测试同样的东西:它们不是字符串文字。
【解决方案3】:

这段话是指对象 identity 与对象 value。关键字is 用于比较对象为相同对象;而运算符== 用于测试相等性

两个对象实例可以具有相同的值,但可以是不同的对象。

CPython 的示例,它缓存某些整数作为内部优化,但不能保证,因此您的结果可能会有所不同:

>>> a = 999
>>> b = 999
>>> a == b       # equal
True
>>> a is b       # not the same object!
False
>>> a = 5
>>> b = 5
>>> a == b       # also equal
True
>>> a is b       # and happen to be the same object
True

这演示了短语“可能获得相同的对象或具有相同值的不同对象。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    相关资源
    最近更新 更多