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中getattr函数使用方法 getattr实现工厂模式
Jan 20 Python
python通过pil模块获得图片exif信息的方法
Mar 16 Python
简述Python中的面向对象编程的概念
Apr 27 Python
Python Flask-web表单使用详解
Nov 18 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
Apr 02 Python
win8下python3.4安装和环境配置图文教程
Jul 31 Python
pandas中apply和transform方法的性能比较及区别介绍
Oct 30 Python
Django 简单实现分页与搜索功能的示例代码
Nov 07 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
Jan 10 Python
Python模块_PyLibTiff读取tif文件的实例
Jan 13 Python
Appium+Python实现简单的自动化登录测试的实现
Jan 26 Python
Python3 如何开启自带http服务
May 18 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脚本的10个技巧(4)
2006/10/09 PHP
用PHP实现读取和编写XML DOM代码
2010/04/07 PHP
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
很酷的javascript loading效果代码
2008/06/18 Javascript
js调试系列 源码定位与调试[基础篇]
2014/06/18 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
Javascript验证方法大全
2015/09/21 Javascript
javascript中FOREACH数组方法使用示例
2016/03/01 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
javaScript中定义类或对象的五种方式总结
2016/12/04 Javascript
使用ionic切换页面卡顿的解决方法
2016/12/16 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
详解React Native网络请求fetch简单封装
2017/08/10 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
Vue项目中跨域问题解决方案
2018/06/05 Javascript
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
Python深入学习之对象的属性
2014/08/31 Python
python pyinstaller 加载ui路径方法
2019/06/10 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
详解Python中的路径问题
2020/09/02 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
企业治理工作自我评价
2013/09/26 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
教师自我剖析材料(四风问题)
2014/09/30 职场文书
趣味运动会开幕词
2015/01/28 职场文书
导游词之云南丽江古城
2019/09/17 职场文书
Win10系统下配置Java环境变量
2021/06/13 Java/Android