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实现正则匹配检索远端FTP目录下的文件
Mar 25 Python
使用Python保存网页上的图片或者保存页面为截图
Mar 05 Python
Python中装饰器高级用法详解
Dec 25 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
Feb 23 Python
纯python实现机器学习之kNN算法示例
Mar 01 Python
Django中间件实现拦截器的方法
Jun 01 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 Python
Python read函数按字节(字符)读取文件的实现
Jul 03 Python
Python 占位符的使用方法详解
Jul 10 Python
Django 开发环境配置过程详解
Jul 18 Python
在Python中获取操作系统的进程信息
Aug 27 Python
使用python代码进行身份证号校验的实现示例
Nov 21 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简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
jquery 插件学习(四)
2012/08/06 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
JavaScript中Cookies的相关使用教程
2015/06/04 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
Javascript6中字符串的四个新用法分享
2016/09/11 Javascript
Nodejs中使用phantom将html转为pdf或图片格式的方法
2017/09/18 NodeJs
详解vue-router 初始化时做了什么
2018/06/11 Javascript
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
SVM基本概念及Python实现代码
2017/12/27 Python
Python logging管理不同级别log打印和存储实例
2018/01/19 Python
Numpy掩码式数组详解
2018/04/17 Python
如何基于python生成list的所有的子集
2019/11/11 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
dpn网络的pytorch实现方式
2020/01/14 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
python Pexpect模块的使用
2020/12/25 Python
CSS3 选择器 基本选择器介绍
2012/01/21 HTML / CSS
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
《自选商场》教学反思
2014/02/14 职场文书
2015年教研组工作总结
2015/05/04 职场文书
高中军训感想
2015/08/07 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
2019最新校园运动会广播稿!
2019/06/28 职场文书
关于 Python json中load和loads区别
2021/11/07 Python
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android