【问题标题】:Special characters in string in Python [duplicate]Python中字符串中的特殊字符[重复]
【发布时间】:2021-04-22 17:31:45
【问题描述】:

我不明白为什么a1b1 变量指的是同一个东西,而a2b2 不是指同一个东西:

a1="abc123"
b1="abc123"

print(a1 is b1)

输出:

True
a2="+abc123"
b2="+abc123"

print(a2 is b2)

输出:

False

【问题讨论】:

  • 你能解释一下“为什么”是什么意思吗?字符串是不可变的,Python 语言不保证它们的身份——它们可能相同,也可能不相同。如果您一般要求 Python,那么这两种结果实际上都没有理由。您是在问为什么某些特定的实现会这样工作吗?怎么可能?为什么+、长度之类的东西是触发器?
  • 请注意,此行为至少取决于实现以及语句是否一起翻译(即相同的模块或相同的 REPL 输入)。您必须清楚地说明这一点。

标签: python python-3.x string


【解决方案1】:

您误解了 is 运算符的测试内容。它测试两个变量是否指向同一个对象,而不是两个变量是否具有相同的值。

来自 is 运算符的文档:

运算符 is 和 is not 测试对象身份:x 是 y 当且仅当 x 和 y 是同一个对象时为真。

我建议你使用相等运算符(==)

以下是如何在您的场景中使用相等运算符:

a2="+abc123"
b2="+abc123"

print(a2 == b2)

输出:

True

如果您使用id() 运算符,则返回对象的“身份”。这是一个整数,保证每个对象在其生命周期内都是唯一且恒定的。生命周期不重叠的两个对象可能具有相同的 id() 值。

测试 b1 的 id

id(a2)

输出:

1600416721776

测试 b2 的 id

id(b2)

输出:

1600416732976

使用id() 操作符你可以看到它们没有指向同一个对象

值得一提的是,将is 运算符用于字符串是一个坏主意,因为字母数字字符串总是共享内存,非字母数字字符串只有当它们共享相同的块(函数,对象, 行, 文件):

字母数字字符串:

a='abc'
b='abc'
print('a is b: ' a is b)

输出:

a is b: True

非字母数字字符串:

A='+abc123'; B='+abc123';
C='+abc123';
print('A is B: 'A is B)
print('A is C: 'A is C)

输出:

A is B: True 

A is C: False 

【讨论】:

  • 我不认为 OP 误解了操作员。他们明确提到“a1,b1 变量指的是相同的东西”,暗示着同一性而不是相等性。
  • a1, b1 在 OP 代码中具有相同的 id,在我的测试中也是如此。相比之下,a2、b2 并不是 OP 所要求的。
  • 请重新阅读问题。 OP 知道 a2b2 并不相同。
  • “字母数字字符串的始终共享内存和非字母数字字符串的共享内存”不是为真。相等的字符串可能共享内存,你不能依赖is返回Trueis返回False
  • @Jasmilin 在你错误地批评我的回答之前请先看看这个:stackoverflow.com/questions/16756699/…
【解决方案2】:
a2="+abc123" 
b2="+abc123"
print(a2 is b2)

它说的是真的 您可能会留下一些空白空间

【讨论】:

  • 可以构造a2 is b2False 的情况,例如通过在 REPL 中单独输入赋值语句。
  • 真的!非常感谢。
猜你喜欢
  • 2011-09-18
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 2022-01-22
  • 2011-05-11
相关资源
最近更新 更多