Python中字符串的修改及传参详解


Posted in Python onNovember 30, 2016

发现问题

最近在面试的时候遇到一个题目,选择用JavaScript或者Python实现字符串反转,我选择了Python,然后写出了代码(错误的):

#!/usr/bin/env python
#-*-coding:utf-8-*-
__author__ = 'ZhangHe'
def reverse(s):
 l = 0
 r = len(s) - 1
 while l < r:
  s[l],s[r] = s[r],s[l]
  l += 1
  r -= 1
 return s

然后面试官问了两个问题:

(1)可以这样修改字符串的值吗?【我回答的,可以】【回答错误】

(2)传入的参数是地址?还是副本?【我回答的,传值。数字,字符串,元组传值(immutable);list和dict传引用(mutable);】【回答传值,可以直接修改】【回答错误,正确的是传值,immutable】

思考如下

虽然经常使用字符串,但是还真没有研究过这个问题,于是上网搜了一下资料:

Python中的字符串是不可变类型,就是说改变一个字符串的元素需要新建一个新的字符串。

字符串是由独立的字符组成的,也是一种序列,序列的通用操作方法也适用于字符串。

例如:

      通过切片操作顺序地访问子串;

      通过len()求字符串的长度等;

      通过in或not in操作符判断字符串中是否存在某个字符。

Python里面没有字符这个类型,而是用长度为1 的字符串来表示这个概念,当然,这其实也是一个子串。

访问字符串举例:

1 aString = 'Hello World!'
2 print(aString[0])
3 print(aString[1:5])
4 print(aString[6:])

输出:

H
ello
World!

那么如何改变一个字符串呢?

可以通过给一个变量赋值(或者重赋值)的方式“更新”一个已有的字符串。新的值可能与原有值差不多,也可能跟原有串完全不同。

例如:

1 aString = 'Hello World!'
2 aString = aString[:6] + 'Python!'
3 print(aString)
4 aString = 'different string altogether'
5 print(aString)

输出:

Hello Python!
different string altogether

那么如何删除一个字符或字符串呢?

再重复一遍,字符串是不可变的,所以不能仅仅删除一个字符串里的某个字符,你能做的是清空一个空字符串,或者是把剔除了不需要的部分后的字符串组合起来形成一个新串。

假设您想要从“Hello World!”里面删除小写的“l”,那么您需要这样做:

1 aString = 'Hello World!'
2 aString = aString[:3] + aString[4:]
3 print(aString)

输出:

Helo World!

通过赋一个空字符串或者使用del 语句来清空或者删除一个字符串。不过,在大部分应用程序里,没有必要显式的删除字符串。定义这个字符串的代码最终会结束,那时Python 会自动释放这些字符串。

所以,我写的反转字符串代码是有问题的,正确的代码应该是:

#!/usr/bin/env python
#-*-coding:utf-8-*-
__author__ = 'ZhangHe'
def reverse(s):
 t = ''
 r = len(s) - 1
 while r>=0:
  t = t + s[r]
  r -= 1
 return t
s = 'abcd'
print reverse(s)

那么传入的形参s和实参s到底是不是同一个对象呢?可以用id函数来验证,先来看下id函数的官方解释。

Python中字符串的修改及传参详解

也就是说,id(obj)函数返回对象obj在其生命周期内位于内存中的地址,id函数的参数类型是一个对象(Python中一切对象,变量中存放的是对象的引用)

我们可以用下边的代码验证:

#!/usr/bin/env python
#-*-coding:utf-8-*-
__author__ = 'ZhangHe'
def reverse(s):
 print id(s)
 t = ''
 r = len(s) - 1
 while r>=0:
  t = t + s[r]
  r -= 1
 return t
s = 'abasdfasdfcdabasdfasdfcd'
print id(s)
print reverse(s)

输出:

38264224
38264224
dcfdsafdsabadcfdsafdsaba

可以看出传入的参数实际上是字符串对象的地址,如果把参数换成list或dict,那么输出的id还是一样的,所以所,Python中传参的方式都是传入对象的地址,只不过数字,字符串和tuple是不可直接修改,而list和dict是可以直接修改。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
python监控网卡流量并使用graphite绘图的示例
Apr 27 Python
Python实现对excel文件列表值进行统计的方法
Jul 25 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
python入门基础之用户输入与模块初认识
Nov 14 Python
Python中is与==判断的区别
Mar 28 Python
python topN 取最大的N个数或最小的N个数方法
Jun 04 Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 Python
python将txt文档每行内容循环插入数据库的方法
Dec 28 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
Mar 27 Python
django之静态文件 django 2.0 在网页中显示图片的例子
Jul 28 Python
python的移位操作实现详解
Aug 21 Python
Python按顺序遍历并读取文件夹中文件
Apr 29 Python
简单谈谈Python中的闭包
Nov 30 #Python
浅析Python中yield关键词的作用与用法
Nov 29 #Python
Python中 Lambda表达式全面解析
Nov 28 #Python
利用Python抓取行政区划码的方法
Nov 28 #Python
Python抓取手机号归属地信息示例代码
Nov 28 #Python
Python文本相似性计算之编辑距离详解
Nov 28 #Python
Python实现全角半角字符互转的方法
Nov 28 #Python
You might like
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
TBCompressor js代码压缩
2011/01/05 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
2019/04/03 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
python进阶教程之词典、字典、dict
2014/08/29 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
init进程的作用
2015/08/20 面试题
实习生自荐信范文
2013/11/13 职场文书
电气工程自动化求职信
2014/03/14 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
烈士陵园扫墓感想
2015/08/07 职场文书
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
HTML基础详解(上)
2021/10/16 HTML / CSS