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

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

除了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。

专家:你不能改变它们

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

InnoDB事务结构体代码变量列表

事务结构 struct trx_t 写在前面 InnoDB是MySQL的一个存储引擎,支持事务,支持非堵塞的一致性读,物理存储结构是Page,每个事务都有回滚日志,重做日志,事务还会有死锁检测,各种各样不同的锁等等等…

对cookie与session的理解

cookie: 在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。 cookie的出现就是为了解决这个问题, 第一次登录后服务器返回一些数据(…

ubutun 更换网络源_Ubuntu 更换源

1.切换到root用户# su root备份源文件 目录:/etc/apt# cd /etc/apt/# cp sources.list sources.list.bk3.更换源 阿里源 清华源# >sources.list # 清空源# vim sources.list # 选择一个源,复制进去# apt update # 更新源,需要等几分钟# ex…

php : 常用函数

常用函数&#xff1a; <?php /*** 获取客户端IP* return [string] [description]*/ function getClientIp() {$ip NULL;if (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$arr explode(,, $_SERVER[HTTP_X_FORWARDED_FOR]);$pos array_search(unknown,$arr);if(false ! $po…

java日历类add方法_Java日历setFirstDayOfWeek()方法与示例

java日历类add方法日历类setFirstDayOfWeek()方法 (Calendar Class setFirstDayOfWeek() method) setFirstDayOfWeek() method is available in java.util package. setFirstDayOfWeek()方法在java.util包中可用。 setFirstDayOfWeek() method is used to sets the first day o…

zabbix监控部署 与添加主机

zabbix介绍&#xff1a; zabbix&#xff08;[zbiks]&#xff09;是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决…

线段树 洛谷 p1531 I hate it(I hate it too)

这里写链接内容 线段树模板 字符串是一个很诡异的问题。。。。 #include<cstdio> #include<iostream> #include<string> #define q 200000 using namespace std; int a[q5],s[q<<25]; void bu(int o,int l,int r)//建树 {if(lr){s[o]a[r];} else{int…

打开是什么样子的图片_情侣头像 | 无论是什么样子的你 我都好喜欢

点击【情侣图片大全】- 右上角找到【…】立刻设我为星标/置顶 - 不迷路哦情侣图片大全“时光真疯狂&#xff0c;我一路执迷与匆忙”情侣/闺蜜/动漫/闺蜜网名长按图片保存 点击图片放大图片高清&#xff0c;建议在 W i f i 下浏览这个世界是多么神奇我竟然遇见了你无论是什么…

Java File类File [] listFiles()方法(带示例)

File类File [] listFiles() (File Class File[] listFiles()) This method is available in package java.io.File.listFiles(). 软件包java.io.File.listFiles()中提供了此方法。 This method is used to return the names of all the files in the form of an array of files…

zabbix监控平台添加服务(http,nginx,mysql)

1 . 监控httpd服务&#xff1a; 首先确保已经搭建zabbix监控平台&#xff0c;并且将需要监控的主机已经添加。 对主机server2 上的http服务进行监控&#xff0c;首先确保server2主机安装了http服务。 使用http在zabbix中自带监控模版 点击配置->主机->server2->模…

java为什么要重写hashCode和equals方法

如果不被重写&#xff08;原生&#xff09;的hashCode和equals是什么样的&#xff1f;不被重写&#xff08;原生&#xff09;的hashCode值是根据内存地址换算出来的一个值。 不被重写&#xff08;原生&#xff09;的equals方法是严格判断一个对象是否相等的方法&#xff0…

stl中map函数_map :: max_size()函数,以及C ++ STL中的Example

stl中map函数C STL映射:: max_size() (C STL map::max_size() ) It returns the maximum number of elements the container(map) is able to hold but at runtime, the size of the container may be limited to a value smaller than specified by max_size() by the amount…

arduino 蓝牙示例_Arduino简单实例之八_蓝牙模块

1) 说明&#xff1a;蓝牙模块用于和手机或其它带蓝牙的设备通讯。蓝牙设备分为主从两种模式&#xff0c;作为主设备时&#xff0c;它查找和连接其它设备&#xff1b;作为从设备时只能被只它设备连接&#xff1b;通讯模式分透明传输和AT命令模式。最好购买主从一体的蓝牙模…

zabbix使用JMX监控tomcat

JMX 全称是Java Management Extensions,即Java管理扩展。Java程序会开放一些端口&#xff0c;用来获取运行状况。 从Zabbix2.0开始&#xff0c;内置了监控JMX的功能,叫做"Zabbix Java Gateway ",在Zabbix Serve上会启动名为"Zabbix Java Gateway "的进程&…

自定义控件添加属性_|AutoCAD LT 2019 Mac自定义功能区的方法

AutoCAD LT是一款非常好用的CAD三维设计绘图软件&#xff0c;最新版本2019拥有改进的桌面、新应用实现跨设备工作流&#xff0c;以及DWG比较等新功能&#xff0c;并且AutoCAD LT 2019 Mac可以根据你的需要和工作习惯来自定义功能区&#xff0c;下面为大家带来自定义功能区的详细…

操作系统中的文件系统和访问方法

文件 (File) A file is basically a sequence of bytes organized into blocks that are understandable by any machines. In other words, the collection of related information that is stored in a secondary storage device is also called a file. The file is a colle…

centos7镜像加速_docker 镜像加速CentOS7详细介绍

前言在Docker Hub官网上注册帐号&#xff0c;即可下载使用仓库里的全部的docker镜像。而因为网络原因&#xff0c;国内的开发者没办法流畅的下载镜像&#xff0c;经常会出现下载中断的错误。解决方法就是使用国内的容器Hub加速服务&#xff0c;本质就是更改pull优先级较高的服务…

java 根据类名示例化类_Java LocalDateTime类| atOffset()方法与示例

java 根据类名示例化类LocalDateTime类atOffset()方法 (LocalDateTime Class atOffset() method) atOffset() method is available in java.time package. atOffset()方法在java.time包中可用。 atOffset() method is used to create an OffsetDateTime to merge this LocalDat…

Zabbix监控——proxy 分布式监控配置

proxy分布式监控 Zabbix proxy是在大规模分布式监控场景中&#xff0c;采用的一种用以分担server端压力的分层结构&#xff0c; proxy可以代替zabbix server检索客户端的数据&#xff0c;然后把数据汇报给zabbix server&#xff0c;极大的减轻了server的负载压力&#xff0c;使…

AutoCAD_acadiso.dwt卡死

2019独角兽企业重金招聘Python工程师标准>>> 问题描述&#xff1a;每次执行到打开acadiso.dwt就卡死&#xff0c;且电脑显示有网&#xff0c;确打不开网页 可能原因&#xff1a;可能是因为AotuCAD是盗版的 解决办法&#xff1a; 1.在任务管理器中把WSCommCntr.exe进…