首页 > 编程语言 >Python中级之可变数据类型和不可变数据类型

Python中级之可变数据类型和不可变数据类型

时间:2023-12-06 17:45:44浏览次数:38  
标签:修改 Python 数据类型 元组 传递 对象 可变 print

【一】可变数据类型

  • 对于可变类型(如字典、列表、集合),在函数中修改参数会影响原始对象。
  • 当你对于可变类型进行修改操作,并不会返回内容,而是将原本的内容进行了更新
# 字典(dict)
dict1 = {'a': 1, 'b': 2}
dict1.update({'c': 2})
print(dict1)   # {'a': 1, 'b': 2, 'c': 2}
# 列表(list)
list1 = ['a', 'b', 'c']
list1.append('d')
print(list1)    # ['a', 'b', 'c', 'd']
# 集合(set)
set1 = {1, 2, 3, 4}
set1.add(5)
print(set1)    # {1, 2, 3, 4, 5}

【二】不可变数据类型

  • 对于不可变类型(如数值、字符串、布尔),在函数中修改参数不会影响原始对象。
  • 当你对不可变类型进行修改操作时,会返回修改过的内容并需要由变量接收,否则当你重新查看原变量名时发现内容并没有更新
# 数字类型(int/float)
num1 = 1
num1.__add__(2)
print(num1)   # 1

num1 = 1
print(num1, id(num1))   # 1 2308214751472
num1 = num1.__add__(2)
# 需要将其重新赋值,相加的操作才可以实现
# 当重新赋值,那变量num1的原值1将会被垃圾回收清除,重新开辟内存地址存放变量num1的新值3
print(num1, id(num1))   # 3 2308214751536
# 字符串(str)
str1 = '@run@'
str1.strip('@')
print(str1)   # @run@

str1 = '@run@'
print(str1, id(str1))   # @run@ 1737672301872
str1 = str1.strip('@')
print(str1, id(str1))   # run 1737672302000
# 布尔类型(bool)
bool1 = True
print(id(bool1))   # 140710865619816
bool1 = False
print(id(bool1))   # 140710865619848

【三】特殊类型:元组类型Tuple

  • 在 Python 中,元组(tuple)是不可变(immutable)类型。这意味着一旦创建了元组,就不能在原地修改其内容,包括添加、删除或修改元组中的元素。

  • 以下是一个示例:

  • pythonCopy codemy_tuple = (1, 2, 3)
    
    # 尝试修改元组,这会引发 TypeError
    # 元组是不可变的
    my_tuple[0] = 10  # 错误,引发 TypeError
    
  • 由于元组是不可变的,你无法对其进行原地修改。如果你需要对元组进行类似修改的操作,你通常需要创建一个新的元组。

  • 需要注意的是,元组的不可变性仅涉及到元组自身的内容。如果元组包含可变对象(如列表),那么这些可变对象的内容是可以被修改的。但是,元组本身的结构(元素的数量和顺序)是不可变的。

  • tup1 = (1, 2, 3, [4, 5])
    print(id(tup1))    # 1658887470944
    tup1[3].append(6)
    print(tup1)    # (1, 2, 3, [4, 5, 6])
    print(id(tup1))    # 1658887470944
    

【四】相较于其他语言Python的参数传递区别

  • 严格意义上来说,Python既不是值传递,也不是引用传递,python是自己的传递方式
  • 规则是:
    • 如果传递的是不可变类型,在函数中修改,就不会影响原来的变量
    • 如果传递的是可变数据类型,在函数中修改,不会影响原来的变量,修改,而不是重新赋值

img

Python和C语言

  • Python 和 C 语言在参数传递方面有一些重要的区别,主要体现在函数调用时参数是如何传递的。下面是 Python 和 C 语言值传递的主要区别:

1. 值传递和引用传递:

  • C 语言: C 语言采用的是值传递(pass by value)。在函数调用时,将实参的值传递给函数的形参。这意味着函数内对形参的修改不会影响到实参。

    cCopy code#include <stdio.h>
    
    void modifyValue(int x) {
        x = 10;
    }
    
    int main() {
        int num = 5;
        modifyValue(num);
        printf("%d\n", num);  // 输出: 5
        return 0;
    }
    
  • Python: Python 采用的是对象引用传递(pass by object reference)。在函数调用时,将对象引用传递给函数的形参。这意味着如果在函数内部修改了可变对象(例如列表),会影响到实参;但对于不可变对象(例如整数、字符串),函数内的修改不会影响到实参。

    pythonCopy codedef modify_value(lst):
        lst.append(4)
    
    my_list = [1, 2, 3]
    modify_value(my_list)
    print(my_list)  # 输出: [1, 2, 3, 4]
    
    def modify_number(x):
        x = 10
    
    my_number = 5
    modify_number(my_number)
    print(my_number)  # 输出: 5
    

2. 对象的可变性:

  • C 语言: C 中的基本数据类型是不可变的,而数组可以修改,但修改数组的内容不会影响原数组。
  • Python: Python 中一切皆对象,有可变对象(如列表、字典)和不可变对象(如整数、字符串)之分。函数内对可变对象的修改会影响到原对象,而对不可变对象的修改则不会影响原对象。

3. 内存管理:

  • C 语言: 在 C 中,需要手动管理内存,通过指针等进行内存的申请和释放。
  • Python: Python 具有自动的垃圾回收机制,无需手动管理内存。这意味着在 Python 中,你通常不需要担心内存的申请和释放问题。

总体而言,虽然 Python 使用的是对象引用传递,但在实际使用中,理解对象的可变性和不可变性,以及对于可变对象和不可变对象在函数调用中的行为,是更为重要的方面。

Python和Java

Python 和 Java 在参数传递方面有一些重要的区别,主要涉及到参数是如何传递给函数或方法的。下面是 Python 和 Java 传递的主要区别:

1. 值传递和引用传递:

  • Java: Java 使用值传递(pass by value)。在函数调用时,将实际参数的值传递给形式参数。这意味着函数内对形式参数的修改不会影响到实际参数。

    javaCopy codepublic class Example {
        public static void modifyValue(int x) {
            x = 10;
        }
    
        public static void main(String[] args) {
            int num = 5;
            modifyValue(num);
            System.out.println(num);  // 输出: 5
        }
    }
    
  • Python: Python 使用对象引用传递(pass by object reference)。在函数调用时,将对象引用传递给函数的形参。这意味着如果在函数内部修改了可变对象,会影响到实际参数;但对于不可变对象,函数内的修改不会影响到实际参数。

    pythonCopy codedef modify_value(lst):
        lst.append(4)
    
    my_list = [1, 2, 3]
    modify_value(my_list)
    print(my_list)  # 输出: [1, 2, 3, 4]
    
    def modify_number(x):
        x = 10
    
    my_number = 5
    modify_number(my_number)
    print(my_number)  # 输出: 5
    

2. 对象的可变性:

  • Java: Java 中的基本数据类型是不可变的,而对象引用也是传值的。如果传递的是对象引用,修改对象内部的状态会影响原对象。
  • Python: Python 中有可变对象(如列表、字典)和不可变对象(如整数、字符串)之分。函数内对可变对象的修改会影响到原对象,而对不可变对象的修改则不会影响原对象。

3. 异常处理:

  • Java: 在 Java 中,异常是对象,通过引用传递。如果在方法内部捕获并修改异常,对原始调用方不会产生影响。
  • Python: 在 Python 中,异常也是对象,但是异常传递的是引用的副本。如果在函数内捕获并修改异常,对原始调用方也会产生影响。

总体而言,了解参数传递的机制以及对象的可变性和不可变性是理解 Python 和 Java 在这方面的区别的关键。在实际编程中,对于传递给函数的参数如何影响原始数据的理解是非常重要的。

标签:修改,Python,数据类型,元组,传递,对象,可变,print
From: https://www.cnblogs.com/Lea4ning/p/17880132.html

相关文章

  • 【转】How to type pythonic codes
    谈到规范首先想到就是Python有名的PEP8代码规范文档,它定义了编写Pythonic代码的最佳实践。可以在 python.org/dev/peps/pep 上查看。但是真正去仔细研究学习这些规范的朋友并不是很多,对此呢这篇文章摘选一些比较常用的代码整洁和规范的技巧和方法,下面让我们一起来学习吧!......
  • 软件测试/人工智能|Python逻辑运算符如何灵活使用
    前言当初学者探索Python编程时,理解逻辑运算符是掌握编程逻辑和决策流程的重要一环。逻辑运算符允许我们对多个条件进行组合,以便进行更复杂的逻辑判断。让我们深入了解Python中常用的逻辑运算符及其使用方法。逻辑运算符逻辑运算符一般用来解决当有多个关系条件需要判断时使用,......
  • 软件测试/人工智能|Python赋值运算符如何灵活使用
    前言赋值运算符是使用=为运算符号,将运算符左侧的数据或表达式的结果,保存到运算符左侧的标识符中。在使用赋值运算符时,运算符右侧可以是任意类型的数据,但左侧必须是一个变量,否则会报错。除普通的赋值运算符外,赋值运算符还可以和算术运算符组合成为复合赋值运算符。赋值运算符不仅仅......
  • 软件测试/人工智能|一篇文章教你把Python关系运算符玩出花样
    简介关系运算符也称为比较运算符,用来对参与运算的两个操作数进行比较,确认两个操作数之间的关系,运算结果会返回一个布尔值。让我们深入了解Python中常用的关系运算符及其使用方法。Python中提供的关系运算符如下表所示:等于和不等于==检查两个值是否相等。!=检查两个值是否不相等......
  • 软件测试/人工智能|Python逻辑运算符如何灵活使用
    前言当初学者探索Python编程时,理解逻辑运算符是掌握编程逻辑和决策流程的重要一环。逻辑运算符允许我们对多个条件进行组合,以便进行更复杂的逻辑判断。让我们深入了解Python中常用的逻辑运算符及其使用方法。逻辑运算符逻辑运算符一般用来解决当有多个关系条件需要判断时使用,用来确......
  • python HTML文件标题解析问题的挑战
    引言在网络爬虫中,HTML文件标题解析扮演着至关重要的角色。正确地解析HTML文件标题可以帮助爬虫准确地获取所需信息,但是在实际操作中,我们常常会面临一些挑战和问题。本文将探讨在Scrapy中解析HTML文件标题时可能遇到的问题,并提供解决方案。问题背景在解析HTML文件标题的过程中,......
  • python里:引号外面的r、f、u的意思
    加'f'表示格式化字符串举例x=77y=99print(f'{x}+{y}={0}'.format(x+y))#加f后可以在字符串里面使用用花括号括起来的变量和表达式加'r'是防止字符转义如果路径中出现'\t'的话不加r的话\t就会被转义而加了'r'之后'\t'就能保留原有的样子在字符串赋值的时候前面加'r......
  • Python中级之数据类型的内置方法
    常用方法概览#数字类型int():类型强转bin():转换二进制hex():转换十六进制oct():转换八进制int(num,2/8/16)#通过int()为其设置参数可进行机制转换#以下三种判断需在字符串类型下使用.isdigit():判断是否均为整数数字[允许汉语数字].isdecimal():判断是否均为十进制......
  • 神经网络Python代码完整版及其代码解析
     1、读取数据集和标签集1defloadDataSet():2data=[]3label=[]4fr=open('testSet.txt')5forlineinfr.readlines():#循环读写,fr是一个已经打开的文件对象,readline()函数会读取文件中的一行内容6lineArr=lin......
  • python07
    推导式:使用推导式可以快速生成列表、元组、字典以及集合类型的数据1.列表推导式①:基本格式格式:【exp for x in list】for--in-- 用于遍历列表(或者其他可迭代对象)exp 用于对每层循环中的列表元素进行运算  #用循环在列......