Python中等同于Perl引用的实现

2 投票
1 回答
2127 浏览
提问于 2025-04-18 04:46

我是Python初学者,到目前为止我了解到Python没有引用。如果这个说法是对的,那么在Python中,下面这段Perl代码的等价代码是什么呢?

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @grps = qw/grp1:1:2:3 grp2:1:2:3 grp3:1:2:3/;

# CREATES AN ARRAY OF REFERENCES TO ARRAYS - AoR2A
my @agrps;
foreach (@grps){
  push @agrps, [split(":")];
}

# CREATES AN HASH OF REFERENCES TO ARRAYS (REFERENCES ARE THE SAME AS THEY ARE IN AoR2A ABOVE)
my %hgrps;
foreach (@agrps){
   $hgrps{"$_->[0]"} = $_;
}

# THE ELEMENTS CAN BE THEN ACCESSED EITHER VIA ARRAY OR HASH SYNTAX
$hgrps{"grp3"}->[3] = "NEW VALUE 3rd INDEX";
$agrps[2]->[2] = "NEW VALUE 2nd INDEX";

print Dumper @agrps;
print "\n";
print Dumper %hgrps;

上面这段脚本的输出结果是:

$VAR1 = [
          'grp1',
          '1',
          '2',
          '3'
        ];
$VAR2 = [
          'grp2',
          '1',
          '2',
          '3'
        ];
$VAR3 = [
          'grp3',
          '1',
          'NEW VALUE 2nd INDEX',
          'NEW VALUE 3rd INDEX'
        ];

$VAR1 = 'grp3';
$VAR2 = [
          'grp3',
          '1',
          'NEW VALUE 2nd INDEX',
          'NEW VALUE 3rd INDEX'
        ];
$VAR3 = 'grp1';
$VAR4 = [
          'grp1',
          '1',
          '2',
          '3'
        ];
$VAR5 = 'grp2';
$VAR6 = [
          'grp2',
          '1',
          '2',
          '3'
        ];

1 个回答

3

Perl 需要引用主要有两个原因:

  1. 为了以向后兼容的方式处理复杂(也就是嵌套的)数据结构。比如说,如果你写 $hash{entry} = @array,那么每次都得把数组的大小赋值给那个条目,这样就很麻烦。所以使用数组引用就能解决这个问题,写成 $hash{entry} = \@array 就可以了。

    这个问题在 Python 中不存在,因为数组和其他数据结构本身就是引用类型,而不是值类型。

  2. 间接性。比如在 Perl 中,我们可以这样做:

    my $x = 1;
    my $ref = \$x; 
    $$ref = 42;
    # ($x == 42) is true
    

    虽然可以用数组来模拟这个过程,但关键是不要使用值类型。比如说,如果我们想通过引用来改变某个值,就需要两层结构。

    x = [1]
    ref = [x]
    ref[0][0] = 42
    # (x is [42]) is True
    

    如果我们只需要一个指针来指向不同的东西,那么只需要一层就可以了。

    如果你使用一个 Ref 类,可能会更容易理解:

    class Ref(object):
        def __init__(self, val):
            self.val = val
    
    ref = Ref(1)
    ref.val = 42
    

因为你的问题是关于嵌套数据结构的,所以把你的代码转换成 Python 时,不需要任何“数组引用”。普通的列表就可以了。

grps = [...]
argps = list()
hrgps = dict()
for entry in grps:
    fields = entry.split(":") # split returns a list
    argps.append(fields)
    hrgps[fields[0]] = fields

撰写回答