我不知道为什么字符串和元组是不可变的;使它们不可变的优点和缺点是什么?

除了Python解释器的内部实现,这种设计在编写程序上是否有很好的意义?(例如,如果元组和字符串是可变的,会更容易吗?)如果是这样,那么选择不可变元组和列表的例子是什么?(或pherhaps、可变字符串与python字符串)

有一种称为函数式编程的完整编程风格,其中所有东西都是不可变的。en.wikipedia.org/wiki/functional_编程

python确实有可变的字符串和元组;它们分别拼写为bytearray和list。

所谓的fakemutablepython Imagine a语言,你可以在搜索字符串的赋值和年龄使用列表(如mystr[0] = 'a')

a ="abc"

这是创建在内存中存储的地址进入0x1,含"ABC",和标识符a指向它。

现在,说你做的。

b = a

本b点创建的标识符和它同一个内存地址0x1

现在,如果你的字符串是mutable,b变更:

b[0] = 'z'

这个年龄的第一个字节的字符串存储在一个z0x1。标识符是从一个a来指向字符串,因此这会改变的,所以……

print a

print b

两个输出..would zbc

这可以让一些真正奇怪,意想不到的行为。字典的键是一个很好的例子是这样:

mykey = 'abc'

mydict = {

mykey: 123,

'zbc': 321

}

anotherstring = mykey

anotherstring[0] = 'z'

现在事情变得fakemutablepython奇,而你的词典中有两个键,"ABC"和"ZBC"。然后你的年龄"abc"字符串(通过"标识符"anotherstringZBC)",因此"双键的安切洛蒂,ZBC"和"ZBC"……

一个可能的解决方案在本weirdness,每当你分配一个标识符的字符串(或使用它作为一个关键的副本),它是在具备0x1字符串。

这可防止上面的,但如果你有一个字符串,需要200内存?

a ="really, really long string [...]"

b = a

突然,你的脚本需要启动400MB的记忆?这不是很好。

我们点什么,如果它同一个内存地址,直到我们修改它?copy on write。这个问题是相当复杂的,可以做的。

这是immutability是在哪里。而不是要求的.replace()同体复制到一个新的字符串从内存地址,然后修改它的回报。我们只是让所有的不可变的字符串和函数,因此必须创建一个新字符串返回。这解释了以下的代码:

a ="abc"

b = a.replace("a","z")

证明和是由:

>>> a = 'abc'

>>> b = a

>>> id(a) == id(b)

True

>>> b = b.replace("a","z")

>>> id(a) == id(b)

False

(id()函数返回的对象的内存地址)

+1最佳答案。真的?

我听过最好的解释!

那么,如果我说a="abc",b="abcd"它会共享abc吗?就像b[:4]是a?

@Dineshkumar不,我很确定"abc"和"abcd"是不同的,完全无关的,对象-stackoverflow.com/questions/5722006/…

One is performance: knowing that a

string is immutable makes it easy to

lay it out at construction time —

fixed and unchanging storage

requirements. This is also one of the

reasons for the distinction between

tuples and lists. This also allows the

implementation to safely reuse string

objects. For example, the CPython

implemenation uses pre-allocated

objects for single-character strings,

and usually returns the original

string for string operations that

doesn’t change the content.

The other is that strings in Python

are considered as"elemental" as

numbers. No amount of activity will

change the value 8 to anything else,

and in Python, no amount of activity

will change the string"eight" to

anything else.

effbot.org http:/ / / / why-are-python-strings-immutable.htm pyfaq

一大优势是,他们制作的不可变的,他们可以被用来作为在一个字典的键。我可以使用内部数据结构词典是由他们的时间点,如果把钥匙是没有改变。

您可以通过任何用户创建的对象实例(显然是可变的)进行键控。然后"key"可能只是内存地址,如果字符串是可变的,您仍然可以通过它们的唯一内存地址来设置key。

@triptych不是你想要的字符串——你希望它们按值键,否则字典就没什么用处了……

@Hejazzman这不是python指令的工作方式。文字字符串值不用作dict键,而是采用字符串的哈希值。用'abc'.__hash__()向自己证明这一点。

@你说的每一句话都是错的。首先,可以有两个地址不同的相等字符串,因此使用该地址不起作用。第二,当dict使用字符串的散列时,关键是字符串本身——通过显示d.keys()来证明它。您可以很容易地拥有两个具有相同哈希值的字符串,而dict会将它们分开。

@标记勒索而不是地址,哈希。根据定义,不能有两个具有相同哈希值但具有不同哈希值的字符串进行比较。

@你八年前的第一次评论是关于记忆地址的,但我当时没有回复。正确的做法是,不能使用相同的字符串和不同的哈希值,但可以使用相同的哈希值使用不同的字符串!散列本身不足以作为密钥,它只是机制的一部分。

@triptych我知道python dicts是如何工作的(或者任何语言的hashmaps)。这不是我的观点。我的观点是,相同的字符串应该能够指向相同的条目,对于可变的字符串(以及它们作为hashmap中的键的"唯一内存地址")则不是这样。然后需要有完全相同的字符串指针,而不仅仅是相同的字符串内容,才能从字典中获取条目。

不可变的类型是conceptually多mutable比简单酮。例如,你不constructors测量与复制或const的正确性在C + +类。越是不可变类型,语言变得更容易。因此,在最简单的语言是纯粹的功能状态(因为没有任何一个lambda演算的全球多更容易比图灵机,和同样强大的),虽然很多人不欣赏的人。

Perl的字符串函数和mutable安切洛蒂似乎只是罚款。上面的手似乎很多rationalization挥手和一个任意的设计决策。

我的答案的问题,为什么Python Python字符串不可变的安切洛蒂,Guido van Rossum通缉的创造者,因为它现在已经这样,他都是个特殊的legions任意决策和呼吸死亡。

你可以有类似的姿势的问题为什么Perl没有不可变的字符串和一个完整的人会写在passel知识观的字符串是不可变的,以及为什么它是非常bestest IDEA"(TM)是Perl没有他们。

Perl实际上没有字符串:它有scalar,可以作为字符串或数字(后者有多种类型)。如果scalar是不可变的,它将成为纯粹的函数Perl,世界各地的Perl开发人员将通过为自己分配UNdef来自杀。

优点:性能

缺点:你不能改变mutables。

专家:你不能改变它们

python元组为什么不可变_为什么python字符串和元组是不可变的?相关推荐

  1. python元组的定义方式_学习Python元组,有哪些必须要掌握的内容

    展开全部 学习Python元组2113,有哪些必须要掌握的5261内容? 1.Python元组4102 定义 元组是Python的一种内建数据结构.1653关于元组: 1.元组属于序列,可以存放任意元 ...

  2. python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  3. python判断题题库_《Python程序设计》判断题1-240题

    1.Python是一种跨平台.开源.免费的高级动态编程语言.(对) 2.Python 3.x完全兼容Python 2.x.(错) 3.Python 3.x和Python 2.x唯一的区别就是:prin ...

  4. python中类似对象吗_在Python中,两个对象什么时候相同? - python

    似乎2 is 2和3 is 3在python中始终为true,通常,对整数的任何引用都与对相同整数的任何其他引用相同. None(即None is None)也是如此.我知道用户定义类型或可变类型不会 ...

  5. python基础知心得总结_【python】基础学习心得总结(一)

    本文将简单阐述一些基本的python知识点,大多是本人在学习过程中的心得体会.简单常用的编程概念和思想将不再描述.若有理解错误,还望指正. 一.python运行,调试 python和相关软件可以在官网 ...

  6. list python 访问 键值对_基础|Python常用知识点汇总(中)

    字符串字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串.1.创建字符串 str1 = 'Hello World!' str2 = "Hello W ...

  7. python树莓派编程 沃尔弗拉姆_《 Python树莓派编程》——3.3 Python入门-阿里云开发者社区...

    本节书摘来自华章出版社<Python树莓派编程>一书中的第3章,第3.3节,作者:[美]沃尔弗拉姆·多纳特(Wolfram Donat)著韩德强 等译,更多章节内容可以访问云栖社区&quo ...

  8. python中append函数解析_对python中的pop函数和append函数详解

    对python中的pop函数和append函数详解 pop()函数 1.描述 pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. 语法 pop()方法语法: list. ...

  9. python进阶之学习笔记_干货 | Python进阶系列之学习笔记(二)

    目录 对象 字符串 一.对象 (1)什么是对象 在python中一切都是对象,每个对象都有三个属性分别是,(id)身份,就是在内存中的地址,类型(type),是int.字符.字典(dic).列表(li ...

最新文章

  1. Tomcat虚拟主机配置
  2. paddlepaddle-VisualDL2.0对项目进行可视化调参
  3. strcmp可以比较数组么_C语言数组越界了,后果很严重,如何避免?
  4. 162. Find Peak Element
  5. 十、简单线性回归的python实现(详解)
  6. 2020年排名前20的基于SpringBoot搭建的开源项目,帮你快速进行项目搭建!
  7. 屌丝创业从理性“认识你自己”开始
  8. 安卓学习征文 -- 自己定义标题栏
  9. qt按钮功能循环触发_Qt事件循环处理
  10. 图片和Base64编码相互转换
  11. 智能车学习(十四)——K60单片机GPIO学习
  12. eth java_eth钱包开发--java(附带eth离线交易工具类)
  13. tp6 gatewayWorker
  14. azul zing_微软和Azul将OpenJDK提升到Azure云中
  15. 做自媒体1年投资4百W亏损370W,自媒体的水太深
  16. 使用java爬取国家统计局的12位行政区划代码
  17. 【CXY】JAVA基础 之 语法基础
  18. 宽度优先搜索与深度优先搜索
  19. 计算机控制系统第二章答案,计算机控制系统习题参考答案--第2章
  20. 【MongoDB】01、MongoDB基础

热门文章

  1. 显卡、显卡驱动、CUDA、CUDA Toolkit、cuDNN 梳理
  2. java io中断_JDK源码阅读:InterruptibleChannel 与可中断 IO
  3. python中难的算法_Python算法很难吗?python神书《算法图解》PDF电子版分享给你
  4. 关于概率算法的问题,不知道逻辑错在哪里,求debug
  5. 用python + openpyxl处理excel(07+)文档 + 一些中文处理的技巧
  6. PHP 在线 编辑 解析
  7. 【Android】EditText标签调用键盘
  8. MFC消息响应机制及映射机制理解
  9. 映世便携音箱我对你一见钟情啦~
  10. python逐个读取字符_玩转python之字符串逐个字符或逐词反转