Python等效于perl引用

时间:2014-04-29 14:52:40

标签: python perl dictionary reference pass-by-reference

我是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 个答案:

答案 0 :(得分: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
    
  3. 由于您的问题以嵌套数据结构为中心,因此将代码转换为Python不需要任何“数组引用”。普通列表可以。

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