python中关于字符串是不可变的理解

python中字符串是不可变的,但下面的代码怎么理解?

a = 'joe'
a += ' is'
a

会输出 'joe is'

第二个问题:

x = 'a'
y = 'a'
x is y

输出True

x = [1,2]
y = [1,2]
x is y

输出False
why?


已经知道了,按照一楼朋友的方法试了一下,就明白了。感谢
当值是字符串时
x=y='a'和
x='a'
y='a'
都是2个指针指向同一块内存地址

当值是列表时
x=y=[1,2]
x、y的指针指向同一块内存地址
x = [1,2]
y = [1,2]
x、y分别指向不同的内存地址

阅读 9.2k
3 个回答

执行完第一句,输出id(a),最后再执行id(a)看看,就明白了。

a = 'joe'
a += ' is'
a
a+="is"实际是新建立了一个变量a,变量的值是a(原来的joe)加上一个“is”
也就是第一句是一个赋值语句,第二句也是一个赋值语句,不过是后者覆盖了前者。
例如

a="1"
a="2"
a="3"
a

结果你猜到了。

你问的字符串不可变是什么意思,看下面的例子:

a="hello world"
a.upper()

结果 >>HELLO WORLD
a
结果 hello world

对string进行任何操作,如上面的任务,让他大写,他告诉我的大写是什么,但他自己岿然不动。

你要新的字符串就自己b=a.upper(),把结果富裕给另外的值,如果a不想要了,你也可以直接这么写:
a=hello world' a=a.upper()

a就是"HELLO WORLD"

这看起来像sting可变,但其实只是你覆盖了自己而已,不要跟string不可变概念搞混淆了。

以上部分同样适用于js。

此外,
>
a="hello'
b='hello'
id(a)
42926912
id(b)
42926912
```
虽然有两个变量,但内存里只有一个hello,a和b都指向同一个内存地址

第三个问题, 这种情况叫python 的驻留,

>>> l1 = [1, 2, 3]
>>> l2 = [1, 2, 3]
>>> l2 is l1
False
>>> a = 'qwe'
>>> b = 'qwe'
>>> a is b
True
>>> a = 1
>>> b = 1
>>> a is b
True

这里说明,只有数字和字符串有这种机制,这种机制是有限制的

对于字符串, 这能包含a-z[1-9]和 下划线
对于数字乘数超过21就不会这种机制

s1 = 'a'*21
s2 = 'a'*21
s1 is s2
False

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题