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读取excel表格生成erlang数据
Aug 26 Python
Python实现获取邮箱内容并解析的方法示例
Jun 16 Python
python 构造三维全零数组的方法
Nov 12 Python
Python设计模式之迭代器模式原理与用法实例分析
Jan 10 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
PyTorch中的Variable变量详解
Jan 07 Python
pytorch构建多模型实例
Jan 15 Python
Python GUI库PyQt5样式QSS子控件介绍
Feb 25 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
keras 使用Lambda 快速新建层 添加多个参数操作
Jun 10 Python
PyMongo 查询数据的实现
Jun 28 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
Apr 04 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
多php服务器实现多session并发运行
2006/10/09 PHP
php xml-rpc远程调用
2008/12/19 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
PHP7.3.10编译安装教程
2019/10/08 PHP
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
vue 详情跳转至列表页实现列表页缓存
2019/03/27 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
Python代码的打包与发布详解
2014/07/30 Python
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
python处理“
2019/06/10 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
python tkinter组件摆放方式详解
2019/09/16 Python
python Zmail模块简介与使用示例
2020/12/19 Python
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
英国家电直销:Appliances Direct
2016/09/22 全球购物
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
shell程序中如何注释
2012/01/28 面试题
医科大学生毕业的自我评价分享
2013/11/12 职场文书
2014年冬季防火方案
2014/05/21 职场文书
事业单位鉴定材料
2014/05/25 职场文书
群众路线教育查摆剖析材料
2014/10/10 职场文书
工作作风建设心得体会
2014/10/22 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
Java后台生成图片的完整步骤
2021/08/04 Java/Android