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中执行shell命令的几个方法小结
Sep 18 Python
Python变量作用范围实例分析
Jul 07 Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 Python
你应该知道的python列表去重方法
Jan 17 Python
django模型层(model)进行建表、查询与删除的基础教程
Nov 21 Python
SVM基本概念及Python实现代码
Dec 27 Python
python实现人人自动回复、抢沙发功能
Jun 08 Python
python 获取一个值在某个区间的指定倍数的值方法
Nov 12 Python
使用Python开发SQLite代理服务器的方法
Dec 07 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
python中time.ctime()实例用法
Feb 03 Python
解决Pytorch半精度浮点型网络训练的问题
May 24 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
比较全的PHP 会话(session 时间设定)使用入门代码
2008/06/05 PHP
php使用ICQ网关发送手机短信
2013/10/30 PHP
php实现的SESSION类
2014/12/02 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
JavaScript 无符号右移运算符
2009/04/17 Javascript
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
原生js操作checkbox用document.getElementById实现
2013/10/12 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
angularJS Provider、factory、service详解及实例代码
2016/09/21 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
python学习--使用QQ邮箱发送邮件代码实例
2019/04/16 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
2020/06/11 Python
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
教师新年寄语
2014/04/03 职场文书
军训口号
2014/06/13 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
本溪关门山导游词
2015/02/09 职场文书
员工表扬信怎么写
2015/05/05 职场文书
飞越疯人院观后感
2015/06/09 职场文书
初中思想品德教学反思
2016/02/24 职场文书